package controllers

import (
	"net/http"
	"strconv"

	"web-service/models"

	"github.com/gin-gonic/gin"
)

// GetBooks 获取图书列表
func GetBooks(c *gin.Context) {
	// 获取搜索关键词
	keyword := c.Query("keyword")
	books, err := models.GetBooks(keyword)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":  500,
			"msg":   "获取图书列表失败",
			"error": err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
		"data": books,
	})
}

// GetBookByID 获取单本图书详情
func GetBookByID(c *gin.Context) {
	// 获取图书ID
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":  400,
			"msg":   "无效的图书ID",
			"error": err.Error(),
		})
		return
	}

	// 获取图书详情
	book, err := models.GetBookByID(id)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":  500,
			"msg":   "获取图书详情失败",
			"error": err.Error(),
		})
		return
	}

	// 如果图书不存在
	if book == nil {
		c.JSON(http.StatusNotFound, gin.H{
			"code": 404,
			"msg":  "图书不存在",
		})
		return
	}

	// 获取图书标签
	tags, err := models.GetBookTags(id)
	if err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":  500,
			"msg":   "获取图书标签失败",
			"error": err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "success",
		"data": gin.H{
			"book": book,
			"tags": tags,
		},
	})
}

// BookRequest 添加图书请求结构
type BookRequest struct {
	models.Book
	Tags []int64 `json:"tags"`
}

// UpdateBook 更新图书信息
func UpdateBook(c *gin.Context) {
	// 获取图书ID
	id, err := strconv.ParseInt(c.Param("id"), 10, 64)
	if err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":  400,
			"msg":   "无效的图书ID",
			"error": err.Error(),
		})
		return
	}

	// 获取请求体
	var req BookRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":  400,
			"msg":   "参数错误",
			"error": err.Error(),
		})
		return
	}

	// 验证必填字段
	if req.BookName == "" || req.BookAuthor == "" {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"msg":  "书名和作者不能为空",
		})
		return
	}

	// 设置图书ID
	req.Book.ID = id

	// 更新图书信息和标签关系
	if err := models.UpdateBookWithTags(&req.Book, req.Tags); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":  500,
			"msg":   "更新失败",
			"error": err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "更新成功",
		"data": req.Book,
	})
}

// AddBook 添加新图书
func AddBook(c *gin.Context) {
	var req BookRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{
			"code":  400,
			"msg":   "参数错误",
			"error": err.Error(),
		})
		return
	}

	// 验证必填字段
	if req.BookName == "" || req.BookAuthor == "" {
		c.JSON(http.StatusBadRequest, gin.H{
			"code": 400,
			"msg":  "书名和作者不能为空",
		})
		return
	}

	// 添加图书和标签关系
	if err := models.AddBook(&req.Book, req.Tags); err != nil {
		c.JSON(http.StatusInternalServerError, gin.H{
			"code":  500,
			"msg":   "添加失败",
			"error": err.Error(),
		})
		return
	}

	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "添加成功",
		"data": req.Book,
	})
}
